package com.lkc.service.impl;

import com.lkc.bean.Comments;
import com.lkc.bean.Products;
import com.lkc.bean.ShoppingCar;
import com.lkc.bean.Users;
import com.lkc.mapper.*;
import com.lkc.util.ImageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service
public class ImageCleanupService {

    @Autowired
    private ProductsDao productsDao;

    @Autowired
    private CommentsDao commentsDao;

    @Autowired
    private UsersDao usersDao;

    @Autowired
    private ShoppingCarDao shoppingCarDao;

    // 匹配图片URL的正则表达式
    private static final Pattern IMAGE_URL_PATTERN = Pattern.compile("https?://[^/]+/([^/]+\\.(?:jpg|jpeg|png|gif|bmp|webp))");

    /**
     * 获取数据库中所有图片文件名
     * @return 数据库中引用的所有图片文件名列表
     */
    /**
     * 获取数据库中所有图片文件名
     * @return 数据库中引用的所有图片文件名列表
     */
    public List<String> getDatabaseImageNames() {
        List<String> imageNames = new ArrayList<>();

        // 获取商品表中的图片
        List<Products> products = productsDao.all(null);
        for (Products product : products) {
            if (product.getPhoto() != null && !product.getPhoto().isEmpty()) {
                String fileName = extractFileNameFromUrl(product.getPhoto());
                if (fileName != null) {
                    imageNames.add(fileName);
                }
            }
        }

        // 获取评论表中的图片
        List<Comments> comments = commentsDao.all(null); // 修改这一行
        for (Comments comment : comments) {
            if (comment.getPhoto() != null && !comment.getPhoto().isEmpty()) {
                String fileName = extractFileNameFromUrl(comment.getPhoto());
                if (fileName != null) {
                    imageNames.add(fileName);
                }
            }
        }

        // 获取用户表中的图片
        List<Users> users = usersDao.all(null);
        for (Users user : users) {
            if (user.getPhoto() != null && !user.getPhoto().isEmpty()) {
                String fileName = extractFileNameFromUrl(user.getPhoto());
                if (fileName != null) {
                    imageNames.add(fileName);
                }
            }
        }

        // 获取购物车表中的图片
        List<ShoppingCar> shoppingCars = shoppingCarDao.all(null);
        for (ShoppingCar car : shoppingCars) {
            if (car.getPhoto() != null && !car.getPhoto().isEmpty()) {
                String fileName = extractFileNameFromUrl(car.getPhoto());
                if (fileName != null) {
                    imageNames.add(fileName);
                }
            }
        }

        return imageNames;
    }


    /**
     * 从URL中提取文件名
     * @param url 图片URL
     * @return 文件名
     */
    private String extractFileNameFromUrl(String url) {
        if (url == null || url.isEmpty()) {
            return null;
        }

        Matcher matcher = IMAGE_URL_PATTERN.matcher(url);
        if (matcher.find()) {
            return matcher.group(1);
        }
        return null;
    }

    /**
     * 清理OSS中多余的图片
     */
    public void cleanupUnusedImages() {
        try {
            // 获取OSS中的所有文件
            List<String> ossFiles = ImageUtil.getFlieList();

            // 获取数据库中引用的图片文件名
            List<String> dbImageNames = getDatabaseImageNames();

            // 找出OSS中存在但数据库中不存在的文件
            List<String> filesToDelete = new ArrayList<>();
            for (String ossFile : ossFiles) {
                if (!dbImageNames.contains(ossFile)) {
                    filesToDelete.add(ossFile);
                }
            }

            // 删除多余的文件
            if (!filesToDelete.isEmpty()) {
                System.out.println("发现 " + filesToDelete.size() + " 个未使用的图片文件，准备删除...");
                ImageUtil.deleteList(filesToDelete);
                System.out.println("已删除 " + filesToDelete.size() + " 个未使用的图片文件");
            } else {
                System.out.println("没有发现未使用的图片文件");
            }
        } catch (Exception e) {
            System.err.println("清理图片时发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
